﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using Microsoft.VisualBasic;

namespace ContadorAlchemy
{
    public partial class frmContador : Form
    {
        string _cadena = ConfigurationManager.ConnectionStrings["ConteoRepetidos"].ConnectionString;
        public struct _elementos
        {
            public int _idbase;
            public double _totalitems;
        }
        public Alchemy.Application _aplicacion = new Alchemy.Application(); //quizás sin usar
        public Alchemy.Database _databaseadv;
        public _variablesglobales _variables = new _variablesglobales();
        public _elementos _item = new _elementos();
        public int _contadorbase;
        public string _nombrebasedatos;
        public long _tiempoinicio;
        public long _conexiontotal;
        public long _conexionmaxima;
        public double _bytesleidos;
        public double _bytesescritos;
        public double _contadorquerimientos;
        public double _contadotrans;
        public Alchemy.Viewer _visor1;
        public Alchemy.Viewer _visor2;
        public Alchemy.Viewer _visor3;
        public Alchemy.Viewer _visor4;
        public Alchemy.Viewer _visor5;
        public Alchemy.Viewer _visor6;
        public Alchemy.Viewer _visor7;
        public Alchemy.Viewer _visor8;
        public Alchemy.Viewer _visor9;
        public Alchemy.Viewer _visor10;

        private Alchemy.Item _item1;
        private Alchemy.Item _item2;
        private Alchemy.Item _item3;
        private Alchemy.Item _item4;
        private Alchemy.Item _item5;
        private Alchemy.Item _item6;
        private Alchemy.Item _item7;
        private Alchemy.Item _item8;
        private Alchemy.Item _item9;
        private Alchemy.Item _item10;

        //=============================================
        //================ PASO 1 =====================
        //=============================================
        private void frmContador_Load(object sender, EventArgs e)
        {

            //deshabilita todos los controles excepto el botón de carga de bases
            _deshabilitartodo();
            Conectar.Enabled = true;
            MensajeAvance.Enabled = true;
            Salir.Enabled = true;
            _variables._finfecha = false;
            _variables._iniciofecha = false;
            DataGridViewColumn _columna1 = VisorResultados.Columns[0];
            DataGridViewColumn _columna2 = VisorResultados.Columns[1];
            DataGridViewColumn _columna3 = VisorResultados.Columns[2];
            DataGridViewColumn _columna4 = VisorResultados.Columns[3];
            _columna1.Width = 430;
            _columna2.Width = 77;
            _columna3.Width = 77;
            _columna4.Width = 156;
            

            //deshabilita todos los controles excepto el botón de carga de bases
                        
            _variables._disco = "c:";
            _variables._ruta = @"\tmp";
            _variables._cuentacampos = 0;

            // si no existe la carpeta se crea
            if (Directory.Exists(_variables._disco.Trim() + _variables._ruta.Trim()) == false)
            {
                Directory.CreateDirectory(_variables._disco.Trim() + _variables._ruta.Trim());
            }

            try
            {
                dtsReporteScan.BaseDatos.ReadXml(_variables._disco.Trim() + _variables._ruta.Trim() + @"\" + Convert.ToString(FechaInicio.Value.Date).Replace("/", string.Empty).Replace(":", string.Empty).Replace(" ", string.Empty).Replace("0", string.Empty) + "-" + Convert.ToString(FechaFinaliza.Value.Date).Replace("/", string.Empty).Replace(":", string.Empty).Replace(" ", string.Empty).Replace("0", string.Empty) + "bases.xml");
                dtsReporteScan.Escaneo.ReadXml(_variables._disco.Trim() + _variables._ruta.Trim() + @"\" + Convert.ToString(FechaInicio.Value.Date).Replace("/", string.Empty).Replace(":", string.Empty).Replace(" ", string.Empty).Replace("0", string.Empty) + "-" + Convert.ToString(FechaFinaliza.Value.Date).Replace("/", string.Empty).Replace(":", string.Empty).Replace(" ", string.Empty).Replace("0", string.Empty) + "data.xml");
            }
            catch (Exception ex)
            {
            }

            dynamic _rutaarchivo = _variables._disco.Trim() + _variables._ruta.Trim() + @"\conteo.txt";

            Array _valores = Enum.GetValues(typeof(CalcularValoreHashCs.Algorithm));
            string[] _valordato = Enum.GetNames(typeof(CalcularValoreHashCs.Algorithm));

            foreach (string val in _valordato)
            {
                Algoritmo.Items.Add(val);
            }
            //necesario establecer como propietario y cargar las opciones del owner del servidor
            _aplicacion.SetOwner();
            _aplicacion.CanWrite = true;
        }
        public frmContador()
        {
            InitializeComponent();


        }


        //botones y controles
        private void Detener_Click(object sender, EventArgs e)
        {
            //Mensaje de advertencia de detención de conteo
            DialogResult _resultado = MessageBox.Show("¿Está seguro que desea detener el conteo de doumentos de la base " + ListadoBases.Text + "?\rLa información contabilizada se perderá.", "Detener conteo", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
            switch (_resultado)
            {
                case DialogResult.OK:
                    {
                        foreach (Control c in Controls)
                        {
                            c.Enabled = false;
                        }
                        Conectar.Enabled = true;
                        break;
                    }
                case DialogResult.Cancel: { break; }
            }
        }
        private void Salir_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
        //=============================================
        //================ PASO 2 =====================
        //=============================================
        private void Conectar_Click(object sender, EventArgs e)
        {
            try
            {
                _aplicacion.LoadOptionsFile();
                Alchemy.Database _database;
                //activar botones
                string[] _arreglo = new string[] { "ListadoBases", "ContarTodo", "Algoritmo", "label4" };
                _activarbotones(_arreglo);
                Algoritmo.Focus();
                //llenado del dataset dtsReporteScan
                foreach (Alchemy.Database _databaseloop in _aplicacion.Databases)
                {
                    dtsReporteScan.BaseDatosRow _filabases = dtsReporteScan.BaseDatos.NewBaseDatosRow();
                    _filabases["Nombre"] = _databaseloop.Title.ToUpper();
                    _filabases["NombreBase"] = _databaseloop.Path;
                    _database = _aplicacion.Databases.Add(_databaseloop.Path);
                    _filabases["Ultimo"] = 0;
                    _filabases["Total"] = (_database.LastBuiltID < _database.LastUnbuiltID ? _database.LastUnbuiltID : _database.LastBuiltID);

                    _database = null;
                    dtsReporteScan.BaseDatos.AddBaseDatosRow(_filabases);
                }

                //llenado del Listbox
                Dictionary<string, string> _bases = new Dictionary<string, string>();
                DataTable _tabla = dtsReporteScan.BaseDatos;
                for (int i = 0; i < _tabla.Rows.Count; i++)
                {
                    DataRow _fila = _tabla.Rows[i];
                    _bases.Add(_fila["Nombre"].ToString(), _fila["NombreBase"].ToString());
                }


                ListadoBases.DataSource = new BindingSource(_bases, null);
                ListadoBases.DisplayMember = "Key";
                ListadoBases.ValueMember = "Value";
                //Estas línea deshabilita el selectedIndexChaged cuando se carga la lista
                ListadoBases.ClearSelected();
                this.ListadoBases.SelectedIndexChanged += new System.EventHandler(this.ListadoBases_SelectedIndexChanged);
                //llenado del Listbox
            }
            catch (UnauthorizedAccessException)
            {
                MessageBox.Show("No existen licencias disponibles. Contacte al Administrador Alchemy para liberar una licencia y poder utilizar esta Aplicación", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Application.Exit();
            }
        }
        //=============================================
        //================ PASO 3 =====================
        //=============================================
        private void ListadoBases_SelectedIndexChanged(object sender, EventArgs e)
        {
            string[] _controles = new string[] { "Algoritmo", "label4" };
            _activarbotones(_controles);
            Algoritmo.Focus();
            string[] _controles2 = new string[] { "ContarTodo" };
            _deshabilitarbotones(_controles2);
            _variables._rutabasedatos = ListadoBases.SelectedValue.ToString().Trim();
            _variables._nombrebasedatos = ListadoBases.GetItemText(ListadoBases.SelectedItem);
        }
        //=============================================
        //================ PASO 4 =====================
        //=============================================
        private void Algoritmo_SelectedIndexChanged(object sender, EventArgs e)
        {
            string[] _controles = new string[] { "Contar", "FechaInicio", "FechaFinaliza", "label1", "label2" };
            _activarbotones(_controles);
            FechaInicio.Focus();
        }
        //=============================================
        //================ PASO 5 =====================
        //=============================================
        private void ContarTodo_Click(object sender, EventArgs e)
        {
            string[] _controlesfecha = new string[] { "FechaInicio", "FechaFinaliza", "label1", "label2" };
            _activarbotones(_controlesfecha);
            //Valida Fecha 
            if (!_validafecha()) { return; }
            //Conteo de todas las bases mostradas en el Index
            MensajeAvance.Text = "Contabilizando";
            _limpiarmemoria();
            //Deshabilitación de botones luego de escoger una base para el conteo

            Progreso.Minimum = 1;
            Progreso.Value = 1;
            Progreso.Maximum = dtsReporteScan.BaseDatos.Count;
            //creación de archivo de conteo
            Stream _escribecadena = null;
            string _rutarchivo = _variables._disco.Trim() + _variables._ruta.Trim() + @"\conteo.txt";
            if (!(File.Exists(_rutarchivo)))
            {
                _escribecadena = File.Create(_rutarchivo);
                dtsReporteScan.Escaneo.Clear();
            }

            //------INICIO DEL CONTEO

            //Inicia Temporizadores
            TemporizadorLargo.Start();
            TemporizadorCorto.Start();
            string[] _controles = new string[] { "label3", "label5", "Progreso", "ProgresoDocumentos", "Pausar", "Detener" };
            _activarbotones(_controles);
            //--fin TEMPORIZADORES
            MensajeAvance.Text = "Contabilizando";
            for (_contadorbase = 0; _contadorbase < dtsReporteScan.BaseDatos.Count - 1; _contadorbase++)
            {
                Progreso.Value = _contadorbase + 1;
                _nombrebasedatos = dtsReporteScan.BaseDatos.Rows[_contadorbase][0].ToString();
                _inicia(_nombrebasedatos, dtsReporteScan.BaseDatos.Rows[_contadorbase][1].ToString(), Convert.ToInt32(dtsReporteScan.BaseDatos.Rows[_contadorbase][2].ToString()), Convert.ToInt32(dtsReporteScan.BaseDatos.Rows[_contadorbase][3].ToString()));
            }

            MensajeAvance.Text = "Proceso Terminado";
            MessageBox.Show("Proceso Terminado", "Contador", MessageBoxButtons.OK, MessageBoxIcon.Hand);
            _grabaresultado();
            TemporizadorCorto.Stop();
            TemporizadorLargo.Stop();
            _deshabilitarbotones(_controles);
            VisorResultados.Visible = true;
            VisorResultados.Enabled = true;
            _mostrarresultado();
            Progreso.Value = 0;
            ProgresoDocumentos.Value = 0;
            MensajeAvance.Text = "";

            //------FIN DEL CONTEO
        }
        //=============================================
        //================ PASO 5 =====================
        //=============================================
        private void Contar_Click(object sender, EventArgs e)
        {
            //Valida Fecha 
            if (!_validafecha()) { return; }
            //Conteo de base individual
            MensajeAvance.Text = "Contabilizando";
            _limpiarmemoria();

            //Deshabilitación de botones luego de escoger una base para el conteo

            Progreso.Minimum = 1;
            Progreso.Value = 1;
            Progreso.Maximum = 1;
            //creación de archivo de conteo
            Stream _escribecadena = null;
            string _rutarchivo = _variables._disco.Trim() + _variables._ruta.Trim() + @"\conteo.txt";
            if (!(File.Exists(_rutarchivo)))
            {
                _escribecadena = File.Create(_rutarchivo);
                dtsReporteScan.Escaneo.Clear();
            }

            //------INICIO DEL CONTEO

            //Inicia Temporizadores
            TemporizadorLargo.Start();
            TemporizadorCorto.Start();
            string[] _controles = new string[] { "label5", "ProgresoDocumentos", "Pausar", "Detener" };
            _activarbotones(_controles);
            //--fin TEMPORIZADORES

            var _consulta =
                from dtsReporteScan.BaseDatosRow _p in dtsReporteScan.BaseDatos
                where _p.Field<string>("Nombre") == _variables._nombrebasedatos
                select _p;
            MensajeAvance.Text = "Contabilizando";
            _inicia(_variables._nombrebasedatos, _variables._rutabasedatos, Convert.ToInt32(_consulta.First().Ultimo.ToString()), Convert.ToInt32(_consulta.First().Total.ToString()));

            MensajeAvance.Text = "Proceso Terminado";
            MessageBox.Show("Proceso Terminado", "Contador", MessageBoxButtons.OK, MessageBoxIcon.Hand);

            _grabaresultado();
            TemporizadorCorto.Stop();
            TemporizadorLargo.Stop();
            _deshabilitarbotones(_controles);
            VisorResultados.Visible = true;
            VisorResultados.Enabled = true;
            _mostrarresultado();
            ProgresoDocumentos.Value = 0;
            MensajeAvance.Text = "";

            //------FIN DEL CONTEO

        }
        private void Pausar_Click(object sender, EventArgs e)
        {
            _limpiarmemoria();
            _variables._banderapausa = !_variables._banderapausa;

            if (_variables._banderapausa)
            {
                MensajeAvance.Text = "En Pausa";
                Pausar.Text = "Continuar Conteo";
            }
            else
            {
                MensajeAvance.Text = "Contabilizando";
                Pausar.Text = "Pausar Conteo";
            }


        }

        //funciones de control
        private void MaximoId_Click(object sender, EventArgs e)
        {
            _aplicacion.LoadOptionsFile();
            Alchemy.Database _database;
            Progreso.Minimum = 0;
            Progreso.Maximum = dtsReporteScan.BaseDatos.Count;
            for (_contadorbase = 0; _contadorbase < dtsReporteScan.BaseDatos.Count - 1; _contadorbase++)
            {
                Progreso.Value = _contadorbase;
                _nombrebasedatos = dtsReporteScan.BaseDatos.Rows[_contadorbase].ItemArray[0].ToString();
                _database = _aplicacion.Databases.Add(dtsReporteScan.BaseDatos.Rows[_contadorbase]["NombreBase"].ToString());
                dtsReporteScan.BaseDatos.Rows[_contadorbase]["Total"] = (_database.LastBuiltID < _database.LastUnbuiltID ? _database.LastUnbuiltID * 1.25 : _database.LastBuiltID * 1.25);
                _database = null;

            }

        }
        private void TemporizadorLargo_Tick(object sender, EventArgs e)
        {
            StreamWriter _flujo = new StreamWriter(_variables._disco.Trim() + _variables._ruta.Trim() + @"\" + Convert.ToString(FechaInicio.Value.Date).Replace("/", string.Empty).Replace(":", string.Empty).Replace(" ", string.Empty).Replace("0", string.Empty) + "-" + Convert.ToString(FechaFinaliza.Value.Date).Replace("/", string.Empty).Replace(":", string.Empty).Replace(" ", string.Empty).Replace("0", string.Empty) + "bases.xml");
            dtsReporteScan.BaseDatos.WriteXml(_flujo, XmlWriteMode.IgnoreSchema);
            _flujo.Close();
            _flujo = new StreamWriter(_variables._disco.Trim() + _variables._ruta.Trim() + @"\" + Convert.ToString(FechaInicio.Value.Date).Replace("/", string.Empty).Replace(":", string.Empty).Replace(" ", string.Empty).Replace("0", string.Empty) + "-" + Convert.ToString(FechaFinaliza.Value.Date).Replace("/", string.Empty).Replace(":", string.Empty).Replace(" ", string.Empty).Replace("0", string.Empty) + "data.xml");
            dtsReporteScan.Escaneo.WriteXml(_flujo, XmlWriteMode.IgnoreSchema);
            _flujo.Close();
        }
        private void TemporizadorCorto_Tick(object sender, EventArgs e)
        {
            _grabaresultado();
        }
        private void Contabilizar_Click(object sender, EventArgs e)
        {
            TemporizadorCorto_Tick(sender, e);
        }
        private void GrabarAvance_Click(object sender, EventArgs e)
        {
            _limpiarmemoria();
            MensajeAvance.Text = "Pausando";
            Application.DoEvents();
            Pausar_Click(sender, e);
            MensajeAvance.Text = "Grabando Avance";
            TemporizadorLargo_Tick(sender, e);
            MensajeAvance.Text = "Contabilizando";
            Pausar_Click(sender, e);

        }

        //otros controles

        private void FechaInicio_ValueChanged(object sender, EventArgs e)
        {
            _variables._iniciofecha = true;
        }
        private void FechaFinaliza_ValueChanged(object sender, EventArgs e)
        {
            _variables._finfecha = true;
        }


        //función para activar botones de control de conteo
        public void _activarbotones(string[] _controles)
        {
            foreach (string _item in _controles)
            {
                Control _control = Controls.Find(_item, false).FirstOrDefault();
                _control.Enabled = true;
            }

        }
        public void _deshabilitarbotones(string[] _controles)
        {
            foreach (string _item in _controles)
            {
                Control _control = Controls.Find(_item, false).FirstOrDefault();
                _control.Enabled = false;
            }
        }
        public void _habilitartodo()
        {
            foreach (Control _control in Controls)
            {
                _control.Enabled = true;
            }
        }
        public void _deshabilitartodo()
        {
            foreach (Control _control in Controls)
            {
                _control.Enabled = false;
            }
        }
        //funciones adicionales
        [DllImport("kernel32.dll")]
        private static extern bool SetProcessWorkingSetSize(IntPtr procHandle, int min, int max);
        public void _limpiarmemoria()
        {
            try
            {
                Process _memoria;
                _memoria = Process.GetCurrentProcess();
                SetProcessWorkingSetSize(_memoria.Handle, -1, -1);
            }
            catch
            {
                MessageBox.Show("Error al tratar de liberar memoria", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
        }
        public void _inicia(string _nombrebases, string _bases, int _inicial, int _final)
        {

            int _contador = new int();
            _variables._resultadopaginas = 0;
            ProgresoDocumentos.Maximum = Convert.ToInt32(_item._totalitems);

            _visor1 = _aplicacion.NewViewer(Panel1.Handle.ToInt32());
            _visor2 = _aplicacion.NewViewer(Panel2.Handle.ToInt32());
            _visor3 = _aplicacion.NewViewer(Panel3.Handle.ToInt32());
            _visor4 = _aplicacion.NewViewer(Panel4.Handle.ToInt32());
            _visor5 = _aplicacion.NewViewer(Panel5.Handle.ToInt32());
            _visor6 = _aplicacion.NewViewer(Panel6.Handle.ToInt32());
            _visor7 = _aplicacion.NewViewer(Panel7.Handle.ToInt32());
            _visor8 = _aplicacion.NewViewer(Panel8.Handle.ToInt32());
            _visor9 = _aplicacion.NewViewer(Panel9.Handle.ToInt32());
            _visor10 = _aplicacion.NewViewer(Panel10.Handle.ToInt32());

            _visor1.ToolBar = false;
            _visor2.ToolBar = false;
            _visor3.ToolBar = false;
            _visor4.ToolBar = false;
            _visor5.ToolBar = false;
            _visor6.ToolBar = false;
            _visor7.ToolBar = false;
            _visor8.ToolBar = false;
            _visor9.ToolBar = false;
            _visor10.ToolBar = false;

            _databaseadv = _aplicacion.Databases.Add(_bases);


            _item._idbase = 0;
            _item._totalitems = _final;
            //=========MODIFICACION DE LA FECHA
            int[] _cumplefecha = new int[] { };
            Array.Resize<int>(ref _cumplefecha, Convert.ToInt32(_item._totalitems));
            int _contadorarreglo = new int();
            for (_contador = _inicial + 1; _contador < _item._totalitems; _contador++)
            {

                DateTime _fecha;
                try
                {
                    _fecha = _databaseadv.GetItemByID(_contador).Date;
                }
                catch (NullReferenceException)
                {
                    _fecha = Convert.ToDateTime("1/1/1901");
                }
                if (_fecha >= FechaInicio.Value.Date && _fecha <= FechaFinaliza.Value.Date)
                {
                    _contadorarreglo++;
                    _cumplefecha[_contadorarreglo] = _contador;

                }

            }
            //cambia el total de items no por el total de la base sino por las que cumplen con la fecha escogida
            _item._totalitems = _contadorarreglo;
            //=========MODIFICACION DE LA FECHA
            ProgresoDocumentos.Minimum = _inicial;
            ProgresoDocumentos.Maximum = Convert.ToInt32(_item._totalitems);

            int _contador2 = 0;
            for (_contador = 1; _contador < _item._totalitems; _contador += 10)
            {
                _contador2++;
                ProgresoDocumentos.Value = _contador;

                do
                {
                    Application.DoEvents();
                } while (_variables._banderapausa);

                _item1 = _databaseadv.GetItemByID(Convert.ToInt32(_cumplefecha.GetValue(_contador)));
                _item2 = _databaseadv.GetItemByID(Convert.ToInt32(_cumplefecha.GetValue(_contador + 1)));
                _item3 = _databaseadv.GetItemByID(Convert.ToInt32(_cumplefecha.GetValue(_contador + 2)));
                _item4 = _databaseadv.GetItemByID(Convert.ToInt32(_cumplefecha.GetValue(_contador + 3)));
                _item5 = _databaseadv.GetItemByID(Convert.ToInt32(_cumplefecha.GetValue(_contador + 4)));
                _item6 = _databaseadv.GetItemByID(Convert.ToInt32(_cumplefecha.GetValue(_contador + 5)));
                _item7 = _databaseadv.GetItemByID(Convert.ToInt32(_cumplefecha.GetValue(_contador + 6)));
                _item8 = _databaseadv.GetItemByID(Convert.ToInt32(_cumplefecha.GetValue(_contador + 7)));
                _item9 = _databaseadv.GetItemByID(Convert.ToInt32(_cumplefecha.GetValue(_contador + 8)));
                _item10 = _databaseadv.GetItemByID(Convert.ToInt32(_cumplefecha.GetValue(_contador + 9)));


                _variables._resultadopaginas = _variables._resultadopaginas + _validar(_nombrebases, _item1, _visor1);
                _variables._resultadopaginas = _variables._resultadopaginas + _validar(_nombrebases, _item2, _visor2);
                _variables._resultadopaginas = _variables._resultadopaginas + _validar(_nombrebases, _item3, _visor3);
                _variables._resultadopaginas = _variables._resultadopaginas + _validar(_nombrebases, _item4, _visor4);
                _variables._resultadopaginas = _variables._resultadopaginas + _validar(_nombrebases, _item5, _visor5);
                _variables._resultadopaginas = _variables._resultadopaginas + _validar(_nombrebases, _item6, _visor6);
                _variables._resultadopaginas = _variables._resultadopaginas + _validar(_nombrebases, _item7, _visor7);
                _variables._resultadopaginas = _variables._resultadopaginas + _validar(_nombrebases, _item8, _visor8);
                _variables._resultadopaginas = _variables._resultadopaginas + _validar(_nombrebases, _item9, _visor9);
                _variables._resultadopaginas = _variables._resultadopaginas + _validar(_nombrebases, _item10, _visor10);

                Application.DoEvents();
                if (_contador2 == 50) { _limpiarmemoria(); }
            }

            dtsReporteScan.ResultadosRow _resultado = dtsReporteScan.Resultados.NewResultadosRow();
            _resultado["BaseDatos"] = _nombrebases;
            _resultado["Expedientes"] = _item._totalitems;
            _resultado["Imagenes"] = _variables._resultadopaginas;
            _resultado["FechaRegistro"] = DateAndTime.Now;
            dtsReporteScan.Resultados.Rows.Add(_resultado);

            _visor1 = null;
            _visor2 = null;
            _visor3 = null;
            _visor4 = null;
            _visor5 = null;
            _visor6 = null;
            _visor7 = null;
            _visor8 = null;
            _visor9 = null;
            _visor10 = null;

        }
        public int _validar(string _nombrebase, Alchemy.Item _item, Alchemy.Viewer _visor)
        {
            DataRow _filadatos = null;
            _visor.Visible = true;

            if (!((_item == null)))
            {
                _filadatos = dtsReporteScan.Escaneo.NewEscaneoRow();
                if (!(_item.IsFolder | _item.IsRoot | _item.Format == Alchemy.AuFormatEnum.auFmtOCR | _item.Format == Alchemy.AuFormatEnum.auFmtBinary | _item.Format == Alchemy.AuFormatEnum.auFmtUnknown | _item.Format == Alchemy.AuFormatEnum.auFmtUnknown | _item.Format == Alchemy.AuFormatEnum.auFmtASCII))
                {
                    int _iniciocad = Strings.InStr(_item.Path.ToUpper(), @"\");
                    string _cadena = (Strings.Len(_item.Path) > 0 ? Strings.Mid(_item.Path.ToUpper(), (_iniciocad == 0 ? 1 : _iniciocad)) + "-" : "");


                    _visor.Application.CanWrite = true;
                    if (_item.Format == Alchemy.AuFormatEnum.auFmtPDF)
                    {
                        string _tbHashFile = "";
                        string _archivotemporal = null;
                        int _ra = 0;
                        Random _randomico = new Random();
                        try
                        {
                            _archivotemporal = _variables._disco.Trim() + _variables._ruta.Trim() + @"\archihash" + _randomico.Next(2500000);
                            _item.Retrieve(_archivotemporal);
                            _documentoPDF.Load(_archivotemporal);
                            _filadatos["paginas"] = _documentoPDF.PageCount;
                            _documentoPDF.Close();

                            if ((Strings.Len(_item.Path) > 0))
                            {
                                CalcularValoreHashCs.Checksum chk = new CalcularValoreHashCs.Checksum();
                                _tbHashFile = chk.CalculateFileHash(_archivotemporal, (CalcularValoreHashCs.Algorithm)Algoritmo.SelectedIndex);

                            }
                            FileSystem.Kill(_archivotemporal);

                        }
                        catch (Exception ex)
                        {

                            dtsReporteScan.DuplicadoErrorRow _duplicadoerror = dtsReporteScan.DuplicadoError.NewDuplicadoErrorRow();
                            _duplicadoerror["Id"] = Convert.ToString(_item.ID);
                            _duplicadoerror["Ruta"] = ex.Message.ToString();
                            _duplicadoerror["NombreBase"] = _nombrebase;
                            dtsReporteScan.DuplicadoError.Rows.Add(_duplicadoerror);

                        }
                        try
                        {

                            dtsReporteScan.DuplicadoRow _duplicado = dtsReporteScan.Duplicado.NewDuplicadoRow();
                            _duplicado["Id"] = Convert.ToString(_item.ID);
                            _duplicado["CodigoHash"] = _tbHashFile;
                            _duplicado["NombreBase"] = _nombrebase;
                            _duplicado["Paginas"] = _filadatos["paginas"].ToString();
                            dtsReporteScan.Duplicado.Rows.Add(_duplicado);
                        }

                        catch (Exception ex)
                        {
                            try
                            {

                                dtsReporteScan.DuplicadoErrorRow _duplicadoerror = dtsReporteScan.DuplicadoError.NewDuplicadoErrorRow();
                                _duplicadoerror["Id"] = Convert.ToString(_item.ID);
                                _duplicadoerror["Ruta"] = ex.Message.ToString();
                                _duplicadoerror["NombreBase"] = _nombrebase;
                                dtsReporteScan.DuplicadoError.Rows.Add(_duplicadoerror);
                            }
                            catch (Exception ee)
                            {
                            }
                        }
                    }
                    else
                    {
                        int ra = 0;
                        try
                        {
                            _visor.ViewItem(_item);
                            string _tbHashFile = "";
                            string _archivotemporal = null;

                            try
                            {
                                _filadatos["paginas"] = (_visor.PageCount <= 1 ? 1 : _visor.PageCount);
                                _archivotemporal = _variables._disco.Trim() + _variables._ruta.Trim() + @"\archihashs.txt";
                                _item.Retrieve(_archivotemporal);
                                if ((Strings.Len(_item.Path) > 0))
                                {
                                    CalcularValoreHashCs.Checksum chk = new CalcularValoreHashCs.Checksum();
                                    _tbHashFile = chk.CalculateFileHash(_archivotemporal, (CalcularValoreHashCs.Algorithm)Algoritmo.SelectedIndex);
                                }
                                FileSystem.Kill(_archivotemporal);

                            }
                            catch (Exception ex)
                            {

                                dtsReporteScan.DuplicadoErrorRow _duplicadoerror = dtsReporteScan.DuplicadoError.NewDuplicadoErrorRow();
                                _duplicadoerror["Id"] = Convert.ToString(_item.ID);
                                _duplicadoerror["Ruta"] = ex.Message.ToString();
                                _duplicadoerror["NombreBase"] = _nombrebase;
                                dtsReporteScan.DuplicadoError.Rows.Add(_duplicadoerror);
                            }

                            try
                            {

                                dtsReporteScan.DuplicadoRow _duplicado = dtsReporteScan.Duplicado.NewDuplicadoRow();
                                _duplicado["Id"] = Convert.ToString(_item.ID);
                                _duplicado["CodigoHash"] = _tbHashFile;
                                _duplicado["NombreBase"] = _nombrebase;
                                _duplicado["Paginas"] = _filadatos["paginas"].ToString();
                                dtsReporteScan.Duplicado.Rows.Add(_duplicado);
                            }
                            catch (Exception ex)
                            {
                                try
                                {

                                    dtsReporteScan.DuplicadoErrorRow _duplicadoerror = dtsReporteScan.DuplicadoError.NewDuplicadoErrorRow();
                                    _duplicadoerror["Id"] = Convert.ToString(_item.ID);
                                    _duplicadoerror["Ruta"] = ex.Message.ToString();
                                    _duplicadoerror["NombreBase"] = _nombrebase;
                                    dtsReporteScan.DuplicadoError.Rows.Add(_duplicadoerror);
                                }
                                catch (Exception ee)
                                {
                                }

                            }

                        }
                        catch (Exception ex)
                        {

                            dtsReporteScan.DuplicadoErrorRow _duplicadoerror = dtsReporteScan.DuplicadoError.NewDuplicadoErrorRow();
                            _duplicadoerror["Id"] = Convert.ToString(_item.ID);
                            _duplicadoerror["Ruta"] = ex.Message.ToString();
                            _duplicadoerror["NombreBase"] = _nombrebase;
                            dtsReporteScan.DuplicadoError.Rows.Add(_duplicadoerror);
                        }
                    }
                    try
                    {
                        _filadatos["id"] = _item.ID;
                        dtsReporteScan.BaseDatos.Rows[_contadorbase][2] = _item.ID;
                        _filadatos["BaseDatos"] = _nombrebasedatos.ToUpper();
                        _filadatos["titulo"] = _item.Title;
                        _filadatos["fecha"] = _item.Date.Date;
                        _filadatos["equipo"] = Strings.Mid(_cadena, 1, (Strings.InStr(_cadena, @"\") == 0 ? 1 : Strings.InStr(_cadena, @"\") - 1));
                        dtsReporteScan.Escaneo.Rows.Add(_filadatos);
                    }
                    catch (Exception ex)
                    {
                    }
                }
            }

            try
            {
                int _resultado = Convert.ToInt32(_filadatos["paginas"]);
                return _resultado;
            }
            catch (InvalidCastException)
            {
                int _resultado = 0;
                return _resultado;
            }
        }
        public void _grabaresultado()
        {
            //escribe los duplicados en archivos
            StreamWriter _flujo = new StreamWriter(_variables._disco.Trim() + _variables._ruta.Trim() + @"\" + Convert.ToString(FechaInicio.Value.Date).Replace("/", string.Empty).Replace(":", string.Empty).Replace(" ", string.Empty).Replace("0", string.Empty) + "-" + Convert.ToString(FechaFinaliza.Value.Date).Replace("/", string.Empty).Replace(":", string.Empty).Replace(" ", string.Empty).Replace("0", string.Empty) + "duplicado.xml");
            dtsReporteScan.Duplicado.WriteXml(_flujo, XmlWriteMode.IgnoreSchema);
            _flujo.Close();
            _flujo = new StreamWriter(_variables._disco.Trim() + _variables._ruta.Trim() + @"\" + Convert.ToString(FechaInicio.Value.Date).Replace("/", string.Empty).Replace(":", string.Empty).Replace(" ", string.Empty).Replace("0", string.Empty) + "-" + Convert.ToString(FechaFinaliza.Value.Date).Replace("/", string.Empty).Replace(":", string.Empty).Replace(" ", string.Empty).Replace("0", string.Empty) + "duplicadoerror.xml");
            dtsReporteScan.DuplicadoError.WriteXml(_flujo, XmlWriteMode.IgnoreSchema);
            _flujo.Close();

            object sender = new object();
            EventArgs e = new EventArgs();
            _limpiarmemoria();
            MensajeAvance.Text = "Pausa";
            Application.DoEvents();
            Pausar_Click(sender, e);
            MensajeAvance.Text = "Obteniendo Totales...";

            //LINQ de los escaneos
            var _consulta =
                from dtsReporteScan.EscaneoRow _p in dtsReporteScan.Escaneo
                group _p by _p.Field<string>("BaseDatos") into _base
                select new { _base, _cuentadocumentos = _base.Count(_p => _p.Field<bool>("id")), _sumadocumentos = _base.Sum(_p => _p.Field<double>("paginas")) };

            foreach (var _p in _consulta)
            {
                dtsReporteScan.ResultadosRow _resultado = dtsReporteScan.Resultados.NewResultadosRow();
                _resultado["BaseDatos"] = _p._base;
                _resultado["Expedientes"] = _p._cuentadocumentos;
                _resultado["Imagenes"] = _p._sumadocumentos;
                _resultado["FechaRegistro"] = DateAndTime.Now;
                dtsReporteScan.Resultados.AddResultadosRow(_resultado);


            }
            //escribe los resultados del proceso de conteo
            _flujo = new StreamWriter(_variables._disco.Trim() + _variables._ruta.Trim() + @"\" + Convert.ToString(FechaInicio.Value.Date).Replace("/", string.Empty).Replace(":", string.Empty).Replace(" ", string.Empty).Replace("0", string.Empty) + "-" + Convert.ToString(FechaFinaliza.Value.Date).Replace("/", string.Empty).Replace(":", string.Empty).Replace(" ", string.Empty).Replace("0", string.Empty) + "resultado.xml");
            dtsReporteScan.Resultados.WriteXml(_flujo, XmlWriteMode.IgnoreSchema);
            _flujo.Close();

            MensajeAvance.Text = "Contabilizando";
            Pausar_Click(sender, e);
        }
        public bool _validafecha()
        {
            bool _bandera;
            if (_variables._iniciofecha == false)
            {
                MessageBox.Show("Escoja por favor una fecha de inicio");
                FechaInicio.Focus();
                _bandera = false;
                return _bandera;
            }
            else if (_variables._finfecha == false)
            {
                MessageBox.Show("Escoja por favor una fecha de finalización");
                FechaFinaliza.Focus();
                _bandera = false;
                return _bandera;
            }
            else if (_variables._iniciofecha == false && _variables._finfecha == false)
            {
                MessageBox.Show("Escoja por favor fechas de evaluación");
                FechaInicio.Focus();
                _bandera = false;
                return _bandera;
            }
            else
            {
                _bandera = true;
                return _bandera;
            }
        }
        public void _mostrarresultado()
        {
            VisorResultados.Update();
        }

    }
    public class _variablesglobales
    {
        public string _rutabasedatos;
        public string _disco;
        public string _ruta;
        public string _nombrebasedatos;
        public byte _cuentacampos;
        public bool _banderapausa;
        public bool _iniciofecha;
        public bool _finfecha;
        public int _resultadopaginas;
        public int _resultadodocumentos;
        public string _resultadobase;

    }
}
